﻿using System;
using System.Data;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Xml.Linq;
using MySql.Data.MySqlClient;
using MySql.Data.Types;
using System.Data.Sql;
using System.Data.SqlClient;

/// Espacio de nombres para los contenedores
namespace GCon
{

    /// <summary>
    /// Clase contenedora de Perfil
    /// </summary>
    public class Con_Perfil
    {
        /// <summary>
        /// Constructor por defecto
        /// </summary>
        public Con_Perfil()
        {
            dFuncionesDePerfil = new Dictionary<String, Con_Funcion>();
        }

        /// <summary>
        /// Constructor con todos los parametros
        /// </summary>
        public Con_Perfil(String ID_PK, String NOMBRE, String DESCRIPCION)
        {
            this._ID_PK = ID_PK;
            this._NOMBRE = NOMBRE;
            this._DESCRIPCION = DESCRIPCION;
            dFuncionesDePerfil = new Dictionary<String, Con_Funcion>();
        }

        /// <summary>
        /// Constructor de copia
        /// </summary>
        /// <param name="otro"></param>
        public Con_Perfil(Con_Perfil otro)
        {
            this._ID_PK = otro._ID_PK;
            this._NOMBRE = otro._NOMBRE;
            this._DESCRIPCION = otro._DESCRIPCION;
            this.dFuncionesDePerfil = otro.dFuncionesDePerfil;
        }

        /// Getters
        public String Get_ID_PK()
        {
            return this._ID_PK;
        }
        public String Get_NOMBRE()
        {
            return this._NOMBRE;
        }
        public String Get_DESCRIPCION()
        {
            return this._DESCRIPCION;
        }

        /// Setters
        public void Set_ID_PK(String parametro)
        {
            this._ID_PK = parametro;
        }
        public void Set_NOMBRE(String parametro)
        {
            this._NOMBRE = parametro;
        }
        public void Set_DESCRIPCION(String parametro)
        {
            this._DESCRIPCION = parametro;
        }

        /// <summary>
        /// Procedimiento de carga.
        /// Recupera de la BBDD el Perfil con Id = IdPerfil.
        /// </summary>
        /// <param name="IdPerfil"></param>
        public void CargaPerfil(int IdPerfil)
        {
            MySqlConnection oConexion;
            MySqlDataAdapter oAdaptador;
            DataSet ds;
            String llamada;

            oConexion = new MySqlConnection();
            oConexion.ConnectionString = "Server=localhost;Database=MERYLAND;Uid=root;Pwd=MERYLAND;";
            oConexion.Open();

            llamada = "CALL CargaPerfil ( '" + IdPerfil + "' );";
            oAdaptador = new MySqlDataAdapter(llamada, oConexion);
            ds = new DataSet();
            oAdaptador.Fill(ds, "Tabla");

            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                this._ID_PK = dr["PERFIL_ID_PK"].ToString();
                this._NOMBRE = dr["PERFIL_NOMBRE"].ToString();
                this._DESCRIPCION = dr["PERFIL_DESCRIPCION"].ToString();
            }

            oConexion.Close();
        }

        /// <summary>
        /// Procedimiento de inserción.
        /// Inserta en la BBDD una Perfil.
        /// </summary>
        public void InsertaPerfil()
        {
            MySqlConnection oConexion;
            MySqlCommand oComando;
            String llamada;

            oConexion = new MySqlConnection();
            oConexion.ConnectionString = "Server=localhost;Database=MERYLAND;Uid=root;Pwd=MERYLAND;";

            llamada = "CALL InsertaPerfil ( '" + this._NOMBRE + "','" + this._DESCRIPCION + "' );";
            oComando = new MySqlCommand(llamada, oConexion);

            oConexion.Open();
            oComando.ExecuteReader();

            oConexion.Close();
        }

        /// <summary>
        /// Procedimiento de modificación.
        /// Modifica en la BBDD una Perfil.
        /// </summary>
        public void ModificaPerfil()
        {
            MySqlConnection oConexion;
            MySqlCommand oComando;
            String llamada;

            oConexion = new MySqlConnection();
            oConexion.ConnectionString = "Server=localhost;Database=MERYLAND;Uid=root;Pwd=MERYLAND;";

            llamada = "CALL ModificaPerfil ( '" + this._ID_PK + "','" + this._NOMBRE + "','" + this._DESCRIPCION + "' );";
            oComando = new MySqlCommand(llamada, oConexion);

            oConexion.Open();
            oComando.ExecuteReader();

            oConexion.Close();
        }

        /// <summary>
        /// Procedimiento de eliminación.
        /// Elimina de la BBDD una Perfil.
        /// </summary>
        public void EliminaPerfil()
        {
            MySqlConnection oConexion;
            MySqlCommand oComando;
            String llamada;

            oConexion = new MySqlConnection();
            oConexion.ConnectionString = "Server=localhost;Database=MERYLAND;Uid=root;Pwd=MERYLAND;";

            llamada = "CALL EliminaPerfil ( '" + this._ID_PK + "' );";
            oComando = new MySqlCommand(llamada, oConexion);

            oConexion.Open();
            oComando.ExecuteReader();

            oConexion.Close();
        }
        
        ///Procedimientos de Funciones de Perfil
        public void ListaFuncionesDePerfil()
        {
            MySqlConnection oConexion;
            MySqlDataAdapter oAdaptador;
            DataSet ds;
            String llamada;
            Con_Funcion oFuncionDePerfil;

            oConexion = new MySqlConnection();
            oConexion.ConnectionString = "Server=localhost;Database=MERYLAND;Uid=root;Pwd=MERYLAND;";
            oConexion.Open();

            llamada = "CALL ListaFuncionesDePerfil( " + this._ID_PK + " )";
            oAdaptador = new MySqlDataAdapter(llamada, oConexion);
            ds = new DataSet();
            oAdaptador.Fill(ds, "Tabla");

            foreach (DataRow dr in ds.Tables[0].Rows)
            {

                oFuncionDePerfil = new Con_Funcion(dr["FUNCION_ID_PK"].ToString(), dr["FUNCION_NOMBRE"].ToString(), dr["FUNCION_DESCRIPCION"].ToString());
                dFuncionesDePerfil.Add(oFuncionDePerfil.Get_ID_PK(), oFuncionDePerfil);
                oFuncionDePerfil = null;

            }

            oConexion.Close();
        }

        public Con_Funcion GetFuncionDePerfil(String Id)
        {
            return this.dFuncionesDePerfil[Id];
        }

        public int cuentaFuncionesDePerfil()
        {
            return this.dFuncionesDePerfil.Count;
        }

        ///Atributos
        private String _ID_PK;
        private String _NOMBRE;
        private String _DESCRIPCION;

        private Dictionary<String, Con_Funcion> dFuncionesDePerfil;

    }
}
